/*
 * PagFormularioAtividade.java
 * 
 * Projeto: Kruskal - SRAC
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */
package srac.controleatividades.cih;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import srac.controleatividades.cci.CtrlAtividade;
import srac.controleatividades.cci.CtrlInterno;
import srac.controleatividades.cdp.Aluno;
import srac.controleatividades.cdp.AtividadeComplementar;
import srac.controleatividades.cdp.Categoria;
import srac.controleatividades.cdp.TipoAtividade;

public class PagFormularioAtividade extends GenericForwardComposer {

    private CtrlAtividade ctrl = CtrlAtividade.getInstance();
    private CtrlInterno ctrlInterno = CtrlInterno.getInstance();
    private Window winFormularioAtividade;
    private Combobox categorias;
    private Combobox tipoAtividades;
    private Textbox descricao;
    private Intbox creditosRequeridos;
    private Button carregarArquivo;
    private Button baixarArquivo;
    private Row linhaBaixarArquivo;
    private Row linhaCarregarArquivo;
    private byte[] bytes = null;
    private Textbox observacao;
    private Button salvarAtividade;
    private AtividadeComplementar obj;
    private int MODO;
    private Hlayout h1;

    @Override
    public void doAfterCompose(Component comp) throws Exception {

        super.doAfterCompose(comp);
        
        this.linhaCarregarArquivo.setVisible(true);
        this.linhaBaixarArquivo.setVisible(false);
        List<Categoria> c = ctrlInterno.obterCategorias(); //Obtem todas as categorias cadastradas

        categorias.setModel(new ListModelList(c, true)); //Popula a combobox
        categorias.setReadonly(true);
    }

    public void onSelect$categorias() {
        Categoria c = null;
        c = (Categoria) categorias.getSelectedItem().getValue(); 
        tipoAtividades.setSelectedItem(null);
        creditosRequeridos.setValue(0);

        if (c != null) {
            List<TipoAtividade> listTipoAtividades = ctrlInterno.obterTipoAtividades(c); //Obtem os tipo de atividades por categoria
            tipoAtividades.setModel(new ListModelList(listTipoAtividades, true));
        }
    }
    
    public void onSelect$tipoAtividades() {
        TipoAtividade t = null;
        t = (TipoAtividade) tipoAtividades.getSelectedItem().getValue(); 

        if (t != null) {
            creditosRequeridos.setValue(t.getCreditos());
        }
    }

    public void onCreate$winFormularioAtividade() {
        //if feito para verificar se existe algum usuario logado, se nao existir eh redirecionado para o login
        if (Executions.getCurrent().getSession().getAttribute("usuario") == null) {
            Executions.sendRedirect("/");
            winFormularioAtividade.detach();
        } 
        else {
            MODO = (Integer) arg.get("tipo");

            if (MODO != ctrl.SALVAR) {
                obj = (AtividadeComplementar) arg.get("obj"); 
                preencherTela();
                if (MODO == ctrl.CONSULTAR) {
                    bloquearTela();
                }
            }
        }
    }

    private void preencherTela() {
        if (obj.getTipoAtividade().getCategoria() != null) {
            ((ListModelList) categorias.getModel()).addToSelection(obj.getTipoAtividade().getCategoria());
            onSelect$categorias();
        }
        if (obj.getTipoAtividade() != null) {
            ((ListModelList) tipoAtividades.getModel()).addToSelection(obj.getTipoAtividade());
        }
        bytes = obj.getArquivo();
        descricao.setValue(obj.getDescricao());
        creditosRequeridos.setValue(obj.getCreditosRequeridos());    
        observacao.setText(obj.getObservacao());
    }

    private void bloquearTela() {
        categorias.setDisabled(true);
        tipoAtividades.setDisabled(true);
        descricao.setDisabled(true);
        creditosRequeridos.setDisabled(true);
        observacao.setDisabled(true);
        this.salvarAtividade.setVisible(false); //Disabilita o botão de salvar
        this.linhaCarregarArquivo.setVisible(false);
        this.linhaBaixarArquivo.setVisible(true);

    }

    public void onClick$salvarAtividade(Event event) {
        AtividadeComplementar a = null;
        String msg = valido();
        if (msg.trim().equals("")) {
            if (MODO == ctrl.EDITAR) {
                
                obj.setTipoAtividade((TipoAtividade) tipoAtividades.getSelectedItem().getValue());
                obj.setDescricao(descricao.getValue());
                obj.setCreditosRequeridos(creditosRequeridos.getValue());
                obj.setCreditosObtidos(creditosRequeridos.getValue());
                obj.setArquivo(bytes);            
                obj.setObservacao(observacao.getText());
                obj.setAluno((Aluno) Executions.getCurrent().getSession().getAttribute("aluno"));
                
                a = ctrl.alterarAtividadeComplementar(obj); //Altera a atividade
                
                if (a != null) { //Se alterou com sucesso
                    winFormularioAtividade.onClose();
                }
            } else {
                ArrayList<Object> list = new ArrayList<Object>();
                list.add(tipoAtividades.getSelectedItem().getValue());
                list.add(descricao.getValue());
                list.add(creditosRequeridos.getValue());
                list.add(this.bytes);
                list.add(observacao.getText());
                list.add((Aluno) Executions.getCurrent().getSession().getAttribute("aluno"));

                
                a = ctrl.incluirAtividadeComplementar(list); //Inclui a nova atividade
                
                if (a != null) {
                    winFormularioAtividade.onClose();
                }
            }
        } else {
            Messagebox.show(msg, "Informe:", 0, Messagebox.EXCLAMATION); //Informa se faltou algum campo a ser preenchido
        }
    }

    public void onClick$voltar(Event event) {
        winFormularioAtividade.onClose();
    }

    public void limparCampos() { //Limpa os campos da tela
        categorias.setSelectedItem(null);
        tipoAtividades.setSelectedItem(null);
        descricao.setValue(null);
        creditosRequeridos.setValue(null);
        observacao.setText("");
    }

    private String valido() { //Verifica se falta completar algum campo
        String msg = "";
        if (categorias.getSelectedItem() == null) {
            msg += "- Categoria\n";
        }
        if (tipoAtividades.getSelectedItem() == null) {
            msg += "- Tipo da Atividade\n";
        }
        if (creditosRequeridos.getValue() == null) {
            msg += "- Creditos Requeridos\n";
        }
        if (this.bytes == null) {
            msg += "- Arquivo\n";
        }

        return msg;
    }

    public void onUpload$carregarArquivo(UploadEvent event) { //Método para carregar o arquivo

        Media media = event.getMedia();

        if (media != null && media.isBinary()) {
            if (media.getByteData().length > 1000 * 1024) {
                Messagebox.show("O arquivo selecionado é muito grande (máx 1MB)!", "Alerta!", 0, Messagebox.EXCLAMATION);
            } else if ("pdf".equals(media.getFormat())) {
                this.bytes = media.getByteData();
                Messagebox.show("O arquivo foi carregado com sucesso!", " ", 0, Messagebox.INFORMATION);
                
            } else {
                Messagebox.show("O arquivo selecionado não é valido! Por favor, selecione um arquivo do tipo pdf.", "Alerta!", 0, Messagebox.EXCLAMATION);
            }
        } else if (media != null && media.isBinary() == false) {
            if (media.getStringData().getBytes().length > 1000 * 1024) {
                Messagebox.show("O arquivo selecionado é muito grande (máx 1MB)!", "Alerta!", 0, Messagebox.EXCLAMATION);
            } else if ("pdf".equals(media.getFormat())) {
                this.bytes = media.getStringData().getBytes();
                Messagebox.show("O arquivo foi carregado com sucesso!", " ", 0, Messagebox.INFORMATION);
            } else {
                Messagebox.show("O arquivo selecionado não é valido! Por favor, selecione um arquivo do tipo pdf.", "Alerta!", 0, Messagebox.EXCLAMATION);
            }
        }
    }
    
    public void onClick$baixarArquivo(Event event) {
        File arq;
        
        arq = ctrl.recuperaArquivoPDF(obj.getArquivo(), obj.getAluno().getMatricula()); //Pega o arquivo do BD

        if (arq != null) {
            Filedownload fd = null;
            try {
                fd.save(arq, null); //Baixa o arquivo
            } catch (FileNotFoundException ex) {
                Messagebox.show("Erro em baixar o arquivo", " ", 0, Messagebox.EXCLAMATION);
            }
        }
    }   
}
